package com.android.wellcherish.workclock.util;

import android.content.SharedPreferences;
import com.android.wellcherish.workclock.bean.db.Record;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.TimeZone;

/**
 * @author 张文琛
 * @date 2019/7/13 19:09
 *
 * 处理时间信息的工具类，使用了 JDK1.8 后加入的时间处理类
 */
public class TimeUtil {

    /**
     * 一天的小时数.
     */
    public static final int HOURS_PER_DAY = 24;
    /**
     * 一小时的分钟数.
     */
    public static final int MINUTES_PER_HOUR = 60;
    /**
     * 一分钟的秒数.
     */
    public static final int SECONDS_PER_MINUTE = 60;
    /**
     * 一秒的纳秒数
     */
    public static final long NANOS_PER_SECOND = 1000_000_000L;
    /**
     * 一天的分钟数.
     */
    public static final int MINUTES_PER_DAY = MINUTES_PER_HOUR * HOURS_PER_DAY;
    /**
     * 一小时的秒数.
     */
    public static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
    /**
     * 一天的秒数.
     */
    public static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;
    /**
     * 一天的毫秒数
     */
    public static final long MILLIS_PER_DAY = SECONDS_PER_DAY * 1000L;
    /**
     * 一分钟的纳秒数
     */
    public static final long NANOS_PER_MINUTE = NANOS_PER_SECOND * SECONDS_PER_MINUTE;
    /**
     * 一小时的纳秒数
     */
    public static final long NANOS_PER_HOUR = NANOS_PER_MINUTE * MINUTES_PER_HOUR;
    /**
     * 一天的纳秒数
     */
    public static final long NANOS_PER_DAY = NANOS_PER_HOUR * HOURS_PER_DAY;

    /**
     * 默认的时区
     */
    public static final String ZONE_ID = "Asia/Shanghai";

    /**
     * 时间的格式化格式
     * */
    public static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

    private static SharedPreferences records;

    private TimeUtil() {}

    /**
     * 判断两个日期是否为同一天，传入的参数应为时间戳模式，精度是秒
     *
     * @return true：两天日期相同，false：两天日期不同
     * */
    public static boolean isSameDay(long second1, long second2) {
        // 第一个参数是long型的时间戳，精度到秒
        // 第二个参数是int型的时间偏移，是在1S内的纳秒数
        // 第三个参数是当前时区到标准时区的偏移量
        LocalDateTime localDateTime1 =
            LocalDateTime.ofEpochSecond(second1, 0, ZoneOffset.UTC);
        LocalDateTime localDateTime2 =
            LocalDateTime.ofEpochSecond(second2, 0, ZoneOffset.UTC);

        // 年相等，并且在年中的天数相等
        return localDateTime1.getYear() == localDateTime2.getYear()
            && localDateTime1.getDayOfYear() == localDateTime2.getDayOfYear();
    }

    /**
     * 得到某个日期
     *
     * @param record 打卡记录
     *
     * @return 返回根据指定打卡记录得到的日期
     * */
    public static String getDate(Record record) {
        if(record == null) {
            return "";
        }
        // UNIX 时间戳距今的天数
        // floorDiv 向下取最大值
        // 模仿 Time 包中的实现
        long days = Math.floorDiv(record.getClickSecond(), SECONDS_PER_DAY);

        LocalDate localDate = LocalDate.ofEpochDay(days);
        localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
        return localDate.toString();
    }

    /**
     * 得到时间，精确到秒
     *
     * @param record 打卡记录
     *
     * @return 返回根据指定打卡记录得到的日期
     * */
    public static String getTime(Record record) {
        if(record == null) {
            return "";
        }

        Instant instant = Instant.ofEpochSecond(record.getClickSecond(), record.getNanoInSecond());

        LocalTime localTime = instant.atZone(ZoneId.of(ZONE_ID)).toLocalTime();

        return timeFormatter.format(localTime);
    }

    /**
     * 获取某一个时间点的时间戳，单位是秒
     * */
    public static long getTimeInstant(ZonedDateTime zonedDateTime) {
        if(zonedDateTime == null) {
            return -1;
        }

        return zonedDateTime.withHour(0).withMinute(0).withSecond(0)
            .getLong(ChronoField.INSTANT_SECONDS);
    }
}
